namespace MiniFS
{
    internal enum Tips
    {
        MAPE,
        DATNE
    }

    internal class Objekts
    {
        public string Nosaukums { get; }
        public Objekts Vecaks;
        public List<Objekts> Berni = new();
        private Tips tips;

        public Objekts(string nosaukums, Tips tips)
        {
            Nosaukums = nosaukums;
            this.tips = tips;
        }

        public bool IrMape() => tips == Tips.MAPE;
        public bool IrDatne() => tips == Tips.DATNE;

        public void Pievienot(bool vaiMape, string nosaukums)
        {
            if (!IrMape()) return; // Tikai mapes var saturēt bērnus
            if (Berni.Any(b => b.Nosaukums == nosaukums)) return; // Neļauj dublēt

            var berns = new Objekts(nosaukums, vaiMape ? Tips.MAPE : Tips.DATNE) { Vecaks = this };
            Berni.Add(berns);
        }

        public void Dzest(string nosaukums)
        {
            var target = Berni.FirstOrDefault(x => x.Nosaukums == nosaukums);
            if (target == null) return;
            if (target.IrMape() && target.Berni.Count > 0)
            {
                Console.Write("Dzēst arī bērnus? (y/n): ");
                if (Console.ReadLine()?.ToLower() != "y") return;
            }
            Berni.Remove(target);
        }

        public void Print()
        {
            foreach (var x in Berni)
                Console.WriteLine(x.IrMape() ? "/" + x.Nosaukums : "~" + x.Nosaukums);
        }
    }

    class Program
    {
        static Objekts sakne = new("disk", Tips.MAPE);
        static Objekts aktiva = sakne;

        static void Main()
        {
            while (true)
            {
                Console.Write($"[{aktiva.Nosaukums}]> ");
                var cmd = Console.ReadLine()?.Split();
                if (cmd == null || cmd.Length == 0) continue;

                switch (cmd[0])
                {
                    case "exit": return;
                    case "mkdir":
                        if (cmd.Length > 1) aktiva.Pievienot(true, cmd[1]);
                        break;
                    case "create":
                        if (cmd.Length > 1) aktiva.Pievienot(false, cmd[1]);
                        break;
                    case "dir": aktiva.Print(); break;
                    case "cd":
                        if (cmd.Length > 1)
                        {
                            if (cmd[1] == ".." && aktiva.Vecaks != null)
                                aktiva = aktiva.Vecaks;
                            else
                            {
                                var next = aktiva.Berni.FirstOrDefault(x => x.Nosaukums == cmd[1] && x.IrMape());
                                if (next != null) aktiva = next;
                            }
                        }
                        break;
                    case "rm":
                        if (cmd.Length > 1) aktiva.Dzest(cmd[1]);
                        break;
                    default: Console.WriteLine("Nezināma komanda"); break;
                }
            }
        }
    }
}